// 字符串哈希
// 求一段字符串任意的两端区间是否相同，我们使用哈希值去求
// 1.利用p进阶，字符出的[0~len-1],从高位到地位，求出前缀哈希值
// 2.p = 131，或者 p = 13331；取模Q取2^64，数太大了我们使用unsigned long long 主动取模
// 3. p[]进制数组，h[]进制前缀和数组，
// 4.求对应区间的前缀和（一维），判断是否一样的字母
#include <iostream>
using namespace std;

typedef unsigned long long ull;

const int N = 1e5 + 10, p = 131;
ull pp[N], h[N];

// 读入的字符串，
char str[N];
// 长度为n，m次询问
int n, m;

ull get(int l, int r)
{
    return h[r] - h[l - 1] * pp[r - l + 1];
}

int main()
{
    cin >> n >> m;
    scanf("%s", str + 1);
    pp[0] = 1;

    for (int i = 1; i <= n; i++)
    {
        // 每一个位的进制
        pp[i] = pp[i - 1] * p;
        // 求出前缀和哈希值,str[i]对应的是1*“字母”
        h[i] = h[i - 1] * p + str[i];
    }
    //那个方便搞那个
    // cin >> str;
    // string str;
    // int l = str.size();
    // pp[0] = 1;
    // for (int i = 0; i < l; i++)
    // {
    //     pp[i + 1] = pp[i] * p;
    //     h[i + 1] = h[i] * p + str[i];
    // }

    while (m--)
    {
        int l1, r1, l2, r2;
        cin >> l1 >> r1 >> l2 >> r2;
        if (get(l1, r1) == get(l2, r2))
        {
            puts("Yes");
        }
        else
        {
            puts("No");
        }
    }

    return 0;
}